using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class LLM_IPairs_VLifeCoreAct : LLMInteractPairsBase
{
    public override string prompt =>
    "你正在进行角色扮演,这是你的信息:" + core.property.ToLLMString() + ",\n" +
    $"现在是:{VLifeSystem.TimeStamp}" + ",\n";

    //单次交互信息
    /**
        body:我正在宿舍楼 Maple Hall 的自习室里复习今天数学课的内容。虽然我很喜欢计算机游戏和乒乓球，但现在得专注于我的弱项——编程作业。作为计算机科学专业的大二学生，我知道时间管理很重要。

        “sake”抬头看了看表，已经是晚上9点了。她决定再学30分钟数学，然后去楼下自动售货机买点夜宵补充能量继续学习。隔壁桌是机器人俱乐部的朋友，他们也在热烈讨论即将到来的比赛。

        “明天还要早起去操场打乒乓球呢，得抓紧时间。”她心想，又低头专注在笔记本电脑上的Python代码中了。
    **/
    //注解:人的具体的行为是由历史行为的积分和当前环境的变量共同构成的, 只关注大的环境会导致具体行为失控
    //也即是说微观上的行为 受到
    // [时间导致特定事件发生 -> 环境改变 -> 微观行为集发生改变]
    // [时间导致特定事件发生 -> 宏观环境改变 -> 微观环境改变 ->微观行为集改变]

    //也就是说在Enter环境的时候, 生成一系列行为集合+退出环境条件


    VLifeCore core;
    public LLM_IPairs_VLifeCoreAct(VLifeCore core)
    {
        this.core = core;
    }
}
public class LLM_IPairs_VLifeEnterState : LLMInteractPairsBase
{
    public override string prompt =>
    "你正在进行角色扮演" +
    $"你会规划你接下来的一天,至多3个Action" + ",\n" +
    "时间严格按照格式{yyyy年M月d日 h:mm}";

    // public override string promptBody =>
    // "这是你的信息" + core.property.ToLLMString() + ",\n" +
    // $"现在是:{VLifeEnv.TimeStamp}" + ",\n" +
    // $"这是你昨天的计划:{core.lastPlan}";

    public override IJsonable JsonableObject => new JsonPack();

    //也就是说在Enter环境的时候, 生成一系列行为集合+退出环境条件
    VLifeCore core;
    string plan;
    public LLM_IPairs_VLifeEnterState(VLifeCore core, string plan = null)
    {
        this.core = core;
        this.plan = plan;
    }

    public class JsonPack : IJsonable
    {
        [JsonProperty("items")]
        public List<Item> items;
        public class Item
        {
            [JsonProperty("Time")]
            public string Time;
            [JsonProperty("Action")]
            public string Action;

            public override string ToString()
            {
                return $"Time:{Time},Action:{Action}";
            }
        }
        public override IJsonable CreateSample()
        {
            return new JsonPack()
            {
                items = new List<Item>() { new Item() }
            };
        }
    }

}

public class LLM_IPairs_VLifeExceuteState : LLMInteractPairsBase
{
    public override string prompt =>
    "你正在进行角色扮演,这是你的信息:" + core.property.ToLLMString() + ",\n" +
    $"现在是:{VLifeSystem.TimeStamp}" + ",\n" +
    $"这是你今天的计划{plan}," +
    "根据你正在做的事充分拓展想象,限制30字,不必过拟合个人信息, 做出更加贴切场景和真实的行为," + $"你正在:{doingAction}";

    //也许需要上下文, 用来限制和合理 , 再加随机参数限定特殊事件
    VLifeCore core;
    string doingAction;
    string plan;
    public LLM_IPairs_VLifeExceuteState(VLifeCore core, string doingAction, string plan)
    {
        this.core = core;
        this.doingAction = doingAction;
        this.plan = plan;
    }
}
//这个地方应该用类来做域自区分， 不要加过多前缀
public class LLMIP_DogTalk : LLMInteractPairsBase
{
    // 这里本应二次分流的交互链，时间所限直接开全局视野了
    // public override string prompt => prompt;
    // public override string promptContextHeader =>"本次指示:" ;
    public override string prompt => _prompt;
    private string _prompt;
    public LLMIP_DogTalk(VLifeCore core, string curOrder, string doingAction, string lastAction, string InteractionSet)
    {
        _prompt =
       "你正在进行角色扮演,你是一条温顺可爱十分活泼的小狗,\n" +
       $"根据主人的提示做出响应!,响应需要从如下的函数中选一个{InteractionSet} 参考样例:" +
       "{谁是好狗狗}{Bark}" +
       "严格按照给定的函数回答,只需要函数,不要附带任何标点符号,前缀,保持大小写";
        interactContext = curOrder;
    }
}



